<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>

</body>
<script>
	// * 创建一个空对象`obj`（`{}`）
	// * 将`obj`的`[__proto__]`属性指向构造函数的原型（即`obj.[[__proto__]] = constrc.prototype`）
	// * 将构造函数内部的`this`绑定到新建的对象`obj`，执行构造函数（也就是跟调用普通函数一样，只是此时函数的this为新创建的对象`obj`而已）
	// * 若构造函数没有返回非原始值（即不是引用类型的值），则返回该新建的对象`obj`（默认会添加`return this`）。否则，返回引用类型的值。
	{
		function newFn(Cont){
			let obj = {};
			obj.__proto__ = Cont.prototype;
			const result = Cont.apply(obj,Array.from(arguments).slice(1));
			if(typeof result === "object" || typeof result === "function"){
				return result;
			}
			return obj;
			
		}
		
		function Box(userName,age){
			this.userName = userName;
			this.age = age;
		}
		// const obj = new Box("zhangsan",12);
		const obj = newFn(Box,"zhangsan",12);
		console.log(obj.userName);// zhangsan
		console.log(obj.age);// 12
		console.log(obj.constructor === Box);// true
		console.log(obj.__proto__ === Box.prototype);// true
	}

</script>
</html>